package com.xxzb.pack0823.线程同步.协作同步;

//面包容器----面包柜（共享资源）
public class BreadContainer {
    private Bread[] breads;//声明一个面包柜数组，共享资源
    private int size=0;//面包柜中面包的数量
    public BreadContainer(int initSize){
        //创建存放面包的数组对象
        this.breads=new Bread[initSize];
    }

    //向面包柜中添加面包的方法(操作共享资源的方法)
    public synchronized void addBread(Bread bread){
        while (size==breads.length){//虚假唤醒
            System.out.println(Thread.currentThread().getName()+":面包柜已满！");
            //当面包柜已满时，当前面包师傅停止生产
            try {
                wait();//让当前线程进入等待状态
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //向面包柜中添加一个面包
        this.breads[size]=bread;
        size++;
        System.out.println(Thread.currentThread().getName()+"向面包柜中添加第"+size+"个面包...");
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        notifyAll();//唤醒正在等待的线程，如果此时没有正在等待的线程就什么都不做
    }

    //从面包柜中取面包的方法（操作共享资源的方法）
    public synchronized void getBread(){
        while (size==0){
            System.out.println(Thread.currentThread().getName()+":面包柜已空......");
            //当面包柜空时，销售员停止销售，等待面包师傅生产面包
            try {
                wait();//让当前线程进入等待状态
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName()+":销售第"+size+"个面包...");
        size--;
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        notifyAll();
    }
}
